package com.dify.tool.common.utils;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;

/**
 * @author shl
 * @date 2025-06-11
 * @description 数字金额转换为中文大写金额工具类
 */
public class MoneyToChineseUtil {
    // 大写数字
    private static final List<String> NUMBERS = Arrays.asList("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖");
    // 整数单位
    private static final List<String> INTEGER_UNITS = Arrays.asList("", "拾", "佰", "仟");
    // 小数单位
    private static final List<String> DECIMAL_UNITS = Arrays.asList("角", "分");
    // 大单位
    private static final List<String> BIG_UNITS = Arrays.asList("", "万", "亿");

    public static String toChinese(BigDecimal amount) {
        if (amount.compareTo(BigDecimal.ZERO) == 0) {
            return "零元整";
        }

        // 处理负数
        boolean isNegative = amount.compareTo(BigDecimal.ZERO) < 0;
        amount = amount.abs();

        String[] parts = amount.toString().split("\\.");
        // 整数部分
        String integerPart = parts[0];
        // 小数部分
        String decimalPart = parts.length > 1 ? parts[1] : "";

        // 处理整数部分
        StringBuilder result = new StringBuilder();
        if (!integerPart.equals("0")) {
            result.append(convertIntegerPart(integerPart)).append("元");
        }

        // 处理小数部分
        if (decimalPart.length() > 0) {
            result.append(convertDecimalPart(decimalPart));
        } else {
            result.append("整");
        }

        return (isNegative ? "负" : "") + result.toString();
    }

    private static String convertIntegerPart(String numStr) {
        StringBuilder sb = new StringBuilder();
        int length = numStr.length();

        // 每4位一组处理（个、万、亿）
        for (int i = 0; i < length; i++) {
            int digit = numStr.charAt(i) - '0';
            int pos = length - i - 1; // 当前位数

            // 添加数字和单位
            if (digit != 0) {
                sb.append(NUMBERS.get(digit)).append(INTEGER_UNITS.get(pos % 4));
            } else {
                // 处理连续的零（如1001 → 壹仟零壹）
                if (i < length - 1 && numStr.charAt(i + 1) != '0') {
                    sb.append("零");
                }
            }

            // 添加大单位（万/亿）
            if (pos % 4 == 0 && pos / 4 > 0) {
                sb.append(BIG_UNITS.get(pos / 4));
            }
        }

        return sb.toString();
    }

    private static String convertDecimalPart(String decimalStr) {
        StringBuilder sb = new StringBuilder();
        // 只处理前两位（角、分）
        for (int i = 0; i < Math.min(decimalStr.length(), 2); i++) {
            int digit = decimalStr.charAt(i) - '0';
            if (digit != 0) {
                sb.append(NUMBERS.get(digit)).append(DECIMAL_UNITS.get(i));
            }
        }
        return sb.toString();
    }
}
